package com.ticket.sass.provider.util;

import com.ticket.sass.common.exception.enums.ErrorCode;
import com.ticket.sass.common.exception.exception.BadRequestException;
import com.ticket.sass.common.file.factory.FileServiceFactory;
import com.ticket.sass.common.file.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.lang.reflect.Field;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Objects;

/**
 * @author ywb
 * @date 2024-04-23 18:42
 */
@Slf4j
@Component
public class FileUtil {
    /**
     * 将临时文件路径转换为正式文件路径，并移动文件到指定位置。
     * 如果文件路径不是临时文件路径格式，则直接返回原始路径。
     *
     * @param tempPath 临时文件路径，格式为 "temp/日期/文件名"
     * @return 如果成功移动文件，则返回新的正式文件路径；否则返回原始路径
     */
    public String tempToFormal(String tempPath) {
        final FileService fileService = FileServiceFactory.getFileService();
        // 查找临时文件前缀
        int tempIndex = tempPath.indexOf("temp/");
        if (tempIndex != -1) {
            // 截取临时文件名（不包含日期部分）
            String fileName = tempPath.substring(tempIndex + 14); // "+14" 是为了跳过 "temp/20240922/" 这部分
            // 移动文件
            if (!fileService.moveFile(tempPath, fileName)) {
//                log.warn("无法移动临时文件到正式位置: {}", tempPath);
                return tempPath;
            }
//            log.info("成功将临时文件移动为正式文件: {}", fileName);
            return fileName;
        }
//        log.debug("输入路径不是临时文件路径: {}", tempPath);
        return tempPath;
    }
    
    
    public String parseP12Certificate(String mchId, MultipartFile p12File) {
        if (Objects.isNull(p12File)){
            return "";
        }
      
        try {
            // 加载p12文件
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            try (ByteArrayInputStream bis = new ByteArrayInputStream(p12File.getBytes())) {
                keyStore.load(bis, mchId.toCharArray()); // 不提供密码
            }
            
            // 获取别名（通常是证书的别名）
            String alias = keyStore.aliases().nextElement();
            
            // 获取证书
            Certificate certificate = keyStore.getCertificate(alias);
            
            // 在这里可以对证书和私钥进行进一步处理，或者直接返回结果
            return certificate.toString();
        } catch (Exception e) {
            // 捕获并记录异常
            log.error("解析P12证书失败: {}", e.getMessage());
            // 返回异常信息
            throw new BadRequestException(
                ErrorCode.BUSINESS_ERROR,
                EscapeUtil.errorMessage("p12File",  "证书解析失败&证书和商户号不匹配")
            );
        }
    }
    
    
    public void tempFieldPro(Object obj, String fieldName) {
        try {
            // 获取对象的类
            Class<?> clazz = obj.getClass();
            // 获取字段
            Field field = clazz.getDeclaredField(fieldName);
            // 设置字段访问权限
            field.setAccessible(true);
            // 获取字段的当前值
            Object value = field.get(obj);
            if (value instanceof String valueStr) {
                // 执行特殊操作
                String result = tempToFormal(valueStr);
                
                result = EscapeUtil.escapeChar(result);
                
                // 设置字段的新值
                field.set(obj, result);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            // 处理异常，例如日志记录或其他操作
        }
    }
    
}
